#ifndef FILEIDENTITYMANAGER_H
#define FILEIDENTITYMANAGER_H

#include <QString>
#include <QDateTime>
#include <QFileInfo>

/**
 * 文件标识管理器
 * 
 * 职责：
 * 1. 为文件生成唯一且稳定的标识
 * 2. 检测文件变更
 * 3. 提供缓存键生成
 * 4. 管理文件元数据
 * 
 * 设计原则：
 * - 基于文件路径 + 元数据指纹，避免内容hash计算
 * - 标识稳定：文件路径不变，标识不变
 * - 可检测变更：通过mtime+size判断文件是否被修改
 * - 性能优先：只读取文件元数据，不读取内容
 */
class FileIdentityManager
{
public:
    /**
     * 获取文件的唯一标识
     * @param filePath 文件绝对路径
     * @return 文件标识，如果文件不存在则返回空字符串
     */
    static QString getFileIdentity(const QString& filePath);
    
    /**
     * 检查文件是否发生变更
     * @param filePath 文件路径
     * @param lastIdentity 上次的标识
     * @return true表示文件已变更
     */
    static bool isFileChanged(const QString& filePath, const QString& lastIdentity);
    
    /**
     * 根据文件标识生成缓存键
     * @param fileIdentity 文件标识
     * @return 缓存键（用于缓存目录命名）
     */
    static QString getCacheKey(const QString& fileIdentity);
    
    /**
     * 从文件标识中提取显示名称
     * @param fileIdentity 文件标识
     * @return 显示名称（文件名）
     */
    static QString getDisplayName(const QString& fileIdentity);
    
    /**
     * 从文件标识中提取文件路径
     * @param fileIdentity 文件标识
     * @return 文件路径
     */
    static QString getFilePath(const QString& fileIdentity);
    
    /**
     * 验证文件标识是否有效
     * @param fileIdentity 文件标识
     * @return true表示标识有效
     */
    static bool isValidIdentity(const QString& fileIdentity);
    
    /**
     * 获取文件类型
     * @param filePath 文件路径
     * @return 文件类型（image/pdf）
     */
    static QString getFileType(const QString& filePath);

private:
    // 禁用实例化
    FileIdentityManager() = delete;
    ~FileIdentityManager() = delete;
    FileIdentityManager(const FileIdentityManager&) = delete;
    FileIdentityManager& operator=(const FileIdentityManager&) = delete;
    
    /**
     * 生成文件元数据指纹
     * @param fileInfo 文件信息
     * @return 元数据指纹
     */
    static QString generateFingerprint(const QFileInfo& fileInfo);
    
    /**
     * 解析文件标识
     * @param fileIdentity 文件标识
     * @return 解析结果（路径、时间、大小、类型）
     */
    static QHash<QString, QString> parseIdentity(const QString& fileIdentity);
};

#endif // FILEIDENTITYMANAGER_H
